package com.atguigu.java;

import java.util.concurrent.TimeUnit;

/**
 * 例子：创建三个窗口买票，总票数为100张，使用继承Thread类的方式
 * 存在线程安全问题，待解决
 *
 * 使用同步方法处理继承Thread类方式中的线程安全问题
 *
 *
 *
 * @author : leimingchao
 * @date Date : 2021年10月02日 10:00
 */

public class WindowTest4 {

    public static void main(String[] args) {

        Window4 w1 = new Window4();
        Window4 w2 = new Window4();
        Window4 w3 = new Window4();

        w1.setName("窗口1");
        w2.setName("窗口2");
        w3.setName("窗口3");

        w1.start();
        w2.start();
        w3.start();

    }
}

class Window4 extends Thread {

    private static int ticket = 100;

    @Override
    public void run() {

        while (true) {

            show();
            if (ticket == 0) {
                break;
            }
        }

    }

    //同步监视器：t1,t2,t3,此种解决方式是错误的
    // private synchronized void show() {，
    //同步监视器：Window4.class
    private static synchronized void show() {
        if (ticket > 0) {
            try {
                TimeUnit.MILLISECONDS.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + ":买票，票号为：" + ticket);
            ticket--;
        }
    }
}
